package com.castle.fortress.admin.argFlow.utils;

import com.castle.fortress.admin.argFlow.exception.FileUploadException;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

/**
 * 文件处理工具类
 */
public class FileUtils {
    
    /**
     * 支持的文档类型
     */
    private static final List<String> SUPPORTED_DOC_TYPES = Arrays.asList(
            "pdf", "doc", "docx", "ppt", "pptx", "xls", "xlsx", "txt", "md", "json", "csv"
    );
    
    /**
     * 检查文件类型是否支持
     *
     * @param originalFilename 原始文件名
     * @return 是否支持
     */
    public static boolean isSupportedDocType(String originalFilename) {
        if (originalFilename == null || originalFilename.isEmpty()) {
            return false;
        }
        
        String extension = getFileExtension(originalFilename);
        return SUPPORTED_DOC_TYPES.contains(extension.toLowerCase());
    }
    
    /**
     * 获取文件扩展名
     *
     * @param filename 文件名
     * @return 扩展名
     */
    public static String getFileExtension(String filename) {
        if (filename == null || filename.isEmpty() || !filename.contains(".")) {
            return "";
        }
        
        return filename.substring(filename.lastIndexOf(".") + 1);
    }
    
    /**
     * 验证文件大小
     *
     * @param file 文件
     * @param maxSizeMB 最大大小（MB）
     * @throws FileUploadException 如果文件过大
     */
    public static void validateFileSize(MultipartFile file, long maxSizeMB) {
        if (file.getSize() > maxSizeMB * 1024 * 1024) {
            throw new FileUploadException("文件过大，最大允许" + maxSizeMB + "MB");
        }
    }
    
    /**
     * 保存文件到临时目录
     *
     * @param file 文件
     * @return 保存的文件
     * @throws IOException 如果保存失败
     */
    public static File saveToTempFile(MultipartFile file) throws IOException {
        String originalFilename = file.getOriginalFilename();
        File tempFile = File.createTempFile("upload_", "_" + originalFilename);
        file.transferTo(tempFile);
        return tempFile;
    }
} 